#ifndef MYSET
#define MYSET

#include "RBTree.h"

namespace wk
{
    template <class K>
    class set
    {
        /**
         * 我的目的是通过一个模板树来实现set和map，但是他们的结构不同
         * 一个是单纯的key，另一个是k-val结构，为了兼容map，模板树的参数
         * 就必须要增加一个，但是map是一个k-val结构，我们是通过键值比较的，
         * 所以这里提供一个仿函数用于得到key
         * 所以RBTree需要三个模板参数，
         * K- 键值
         * T- 存放的真正数据类型
         * KeyOfT-获取存储的key
         */
    private:
        struct SetKeyOfT
        {
            const K &operator()(const K &key)
            {
                return key;
            }
        };

    private:
        using iterator = typename RBTree<K, const K, SetKeyOfT>::Iterator;
        using const_iterator = typename RBTree<K, const K, SetKeyOfT>::ConstIterator;

    public:
        std::pair<iterator, bool> insert(const K &data)
        {
            return _t._insert(data);
        }

        iterator begin()
        {
            return _t.Begin();
        }

        iterator end()
        {
            return _t.End();
        }

        const_iterator cbegin() const
        {
            return _t.Begin();
        }

        const_iterator cend() const
        {
            return _t.End();
        }

    private:
        // STL中set的key是不能被修改的，所以这了第二个模板参数给了const
        RBTree<K, const K, SetKeyOfT> _t;
    };
}

#endif